package com.zjp.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author: zjp
 * @date: 2023-12-03
 * @description: 代理工具类，提供代理
 */
public class ProxyUtil {
    /**
     * @author zjp
     * @date 2023/12/3
     * @description 生成一个代理对象的被代理对象
     * @param bigStar 被代理对象
     * @return Star 代理对象
     */
    public static Star createStarProxy(BigStar bigStar){
        //通过 Proxy.newProxyInstance() 方法创建代理对象
        /*newProxyInstance(ClassLoader loader, 类加载器对象
                Class<?>[] interfaces, 要代理的接口
                InvocationHandler h) 回调方法*/
        Star starProxy = (Star) Proxy.newProxyInstance(
                ProxyUtil.class.getClassLoader(),
                new Class[]{Star.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 代理对象要做的事情
                        if ("sing".equals(method.getName())) { // 代理唱歌方法
                            System.out.println("唱歌准备话筒");
                            System.out.println("唱歌收钱20w");
                        } else if ("dance".equals(method.getName())) {
                            System.out.println("跳舞准备场地");
                            System.out.println("跳舞收钱100w");
                        }

                        return method.invoke(bigStar, args); // 执行被代理对象自己的方法
                    }
                }
        );

        return starProxy;
    }
}
